#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


//编译和链接
/**
* 1.翻译环境和运行环境
* 1.1翻译环境：在这个环境中，源代码被转换成可执行的机器指令(二进制指令)
* 1.2执行环境，用于实际实行代码
* 
* test.c - > 编译 - > 链接 - > 可执行程序 - > 输出结果
*           |翻译环境(V编译器)|| 运行环境(操作系统)   |
* 2.翻译环境
* 由编译和链接两个大的过程组成，编译又可以分解成：预处理，编译，汇编三个过程
* 
* test.c - > 编译器(cl.exe) - > test.obj - > 链接器(link.exe) - > 可执行程序 xxx.exe
* |编译                             ||链接                  |
* 一个c语言项目中可能有多个.c文件一起构建，那多个.c怎么生成可执行程序呢？
* *多个.c文件单独经过编译器，编译处理生成对应的目标文件
* *在Windows环境下的目标文件的后缀是.obj，Linux环境下目标文件的后缀是.o
* *多个目标文件和链接库一起经过链接器处理生成最终的可执行程序
* 链接库是指运行时库或者第三方库
* 
* Linux环境:
* .c为后缀的文件       .i为后缀的文件             .s为后缀的文件       .o为后缀的文件
* 源文件  - > 预处理 ->预处理后的中间文件 ->编译->编译后的中间文件->汇编->目标文件->链接器 + 链接库 ==> 可执行程序
* 
* 2.1预处理(预编译)
* 主要处理那些源文件中#开始的预编译指令
* *将所有的#define删除，并展开所有的宏定义
* *处理所有的条件编译指令，如#if,#ifdef...
* *处理#include预编译指令，将包含在头文件的内容 插入 到该预编译指令的位置，这个过程是递归进行的，也就是说
* 被包含的头文件也可能包含其他头文件
* *删除所有注释(注释是给程序员看的)
* *添加行号和文件名标识，方便后续调试
* 
* 2.2编译
* 将预处理的文件进行一系列的操作：词法分析，语法分析，语义分析及优化，生成相应的汇编代码文件(把C代码->汇编代码)
* 
* 2.3汇编
* 将汇编代码转变成及其可以执行的指令(二进制指令)
* 
* 2.4链接
* 把一堆文件链接在一起生成可执行程序
* 地址修正 - 重定位
*/